import re
import json
import traceback


def check_contain(content, keyword_list):
    if not keyword_list:
        return None
    for ky in keyword_list:
        if content.find(ky) != -1:
            return True
    return None


def clean_ai_markup(text: str):
    """
    需要大量使用AI解析数据为json，sql格式，AI返回的总是带有markdown中的字符

    :param text:
    :return:
    """
    formats = ['json', 'python', 'sql', 'bash']
    if not text:
        return text
    if "```" in text:
        fk_backtick = re.search(r'```(.*?)```', text)
        if not fk_backtick:
            return text
        for f in formats:
            if fk_backtick.group(1).startswith(f):
                return fk_backtick.replace(f, '').strip()
    return text


def parse_llm_json_response(response_content: str, target_key: str = None, default_value=None, fallback_patterns: list = None):
    """
    解析LLM的JSON响应，支持多种解析策略
    
    Args:
        response_content: LLM响应内容
        target_key: 要提取的JSON键名（如果为None，则返回整个JSON对象）
        default_value: 解析失败时的默认值
        fallback_patterns: 备用匹配模式列表，用于从文本中直接提取值
        
    Returns:
        解析出的值或默认值
    """
    try:
        # 尝试直接解析JSON
        if response_content.strip().startswith('{'):
            result = json.loads(response_content.strip())
            if target_key:
                return result.get(target_key, default_value)
            return result
        
        # 尝试从响应中提取JSON部分
        if target_key:
            json_pattern = rf'\{{[^}}]*"{target_key}"[^}}]*\}}'
        else:
            json_pattern = r'\{[^}]*\}'
            
        json_match = re.search(json_pattern, response_content)
        if json_match:
            result = json.loads(json_match.group())
            if target_key:
                return result.get(target_key, default_value)
            return result
        
        # 如果提供了备用模式，尝试直接从文本中提取
        if fallback_patterns and target_key:
            for pattern in fallback_patterns:
                if pattern in response_content.upper():
                    return pattern
        
        return default_value
        
    except Exception as e:
        # 这里不记录日志，让调用方决定如何处理错误
        return default_value
